package sioserver;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 有了这几个类后，再启动server端来处理这些请求就可以构成一个完整的reactor模式的代码。
 * 这个类启动serversocket读取requester发送过来的requestid，交给分发器去处理，
 * serversocket闲置30s后自动关闭，另外这个类还注册了一个shutdownhook，在程序异常终止时，确保serversocket被关闭。
 * 
 * Reactor模式在分发资源和归还资源的时候是同步的，在处理请求的时候，是异步的，实际使用中，真正的业务代码会被放到请求处理程序之中。
 * 
 * @author Xinz
 *
 */
public class SIOServer {

	SIODemultiPlexer demultiPlexer = new SIODemultiPlexer();
	
	public static void main(String args[]) throws IOException {
		SIOServer server = new SIOServer();
		ServerSocket serverSocket = new ServerSocket(8888);
		Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(serverSocket));
		
		long s =System.currentTimeMillis();
		for(;;) {
			if((System.currentTimeMillis() - s) > 30000)
				break;
			Socket socket = serverSocket.accept();
			// 读取客户端传过来的requestId
			int i = socket.getInputStream().read();
			if(i != -1) {
				server.getDemultiPlexer().accept(i);
			}
		}
	}
	
	public SIODemultiPlexer getDemultiPlexer() {
		return demultiPlexer;
	}
}
